babl-icc: implement LUT TRC place holder code
authorØyvind Kolås <pippin@gimp.org>
Wed, 23 Aug 2017 20:16:51 +0000 (22:16 +0200)
committerØyvind Kolås <pippin@gimp.org>
Wed, 23 Aug 2017 20:16:51 +0000 (22:16 +0200)
babl/babl-icc.c
babl/babl-trc.c
babl/babl-trc.h

index e526480426272c42f273b0359905da3d465c9f22..f48a9e09263ec09706d19637ae384057020c80ed 100644 (file)
@@ -325,9 +325,6 @@ static const Babl *babl_trc_lut_find (float *lut, int lut_size)
   {
     for (i = 0; match && i < lut_size; i++)
     {
-      fprintf (stderr, "%i: %f %f\n",
-        i, lut[i], gamma_2_2_to_linear (i / (lut_size-1.0)));
-
       if (fabs (lut[i] - gamma_2_2_to_linear (i / (lut_size-1.0))) > 0.015)
         match = 0;
     }
index e2f98382163f3275a7ad73e823720d8131088d7c..49ff6fd9c707d1d9aeb5339a981a1bfd2e2a796b 100644 (file)
@@ -90,11 +90,17 @@ babl_trc_new (const char *name,
 
   if (n_lut)
   {
+    int j;
     trc_db[i].lut_size = n_lut;
     trc_db[i].lut = babl_calloc (sizeof (float), n_lut);
     memcpy (trc_db[i].lut, lut, sizeof (float) * n_lut);
+    trc_db[i].inv_lut = babl_calloc (sizeof (float), n_lut);
+    for (j = 0; j < n_lut; j++)
+      trc_db[i].inv_lut[j] =
+        babl_trc_to_linear (BABL(&trc_db[i]), trc_db[i].lut[(int) ( j/(n_lut-1.0) * (n_lut-1))]);
+    
   }
-
   return (Babl*)&trc_db[i];
 }
 
index abcf2e27a68a8f6da8bd2af733260cb401453004..abdf52a9520c67f764da7e3626e3d26a98671ea0 100644 (file)
@@ -38,16 +38,31 @@ typedef struct
   double           gamma;
   char             name[128];
   float           *lut;
+  float           *inv_lut;
 } BablTRC;
 
 static inline double babl_trc_lut_from_linear (const Babl *trc_, double value)
 {
-  return 0;
+  BablTRC *trc = (void*)trc_;
+  int entry = value * trc->lut_size + 0.5;
+  double ret = trc->inv_lut[
+    (entry >= 0 && entry < trc->lut_size) ?
+                               entry :
+                               trc->lut_size-1];
+  /* XXX: fixme, do linear interpolation */
+  return ret;
 }
 
 static inline double babl_trc_lut_to_linear (const Babl *trc_, double value)
 {
-  return 0;
+  BablTRC *trc = (void*)trc_;
+  int entry = value * trc->lut_size + 0.5;
+  double ret = trc->lut[
+    (entry >= 0 && entry < trc->lut_size) ?
+                               entry :
+                               trc->lut_size-1];
+  /* XXX: fixme, do linear interpolation */
+  return ret;
 }
 
 static inline double _babl_trc_from_linear (const Babl *trc_, double value)